bitkeeper revision 1.1088.1.1 (40f580e4lUYRavz4xXHwSuq0WmwdyA)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Wed, 14 Jul 2004 18:52:20 +0000 (18:52 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Wed, 14 Jul 2004 18:52:20 +0000 (18:52 +0000)
Clip vbd size to size of underlying device. A temporary fix until we replace
the grow/shrink interface.

linux-2.4.26-xen-sparse/arch/xen/drivers/blkif/backend/vbd.c

index 6704fbb5411dbd0eae85dc0c5d5851be02c3f998..134e94ef26d9f4017b182ea476b1efded99a5ed1 100644 (file)
@@ -79,6 +79,8 @@ void vbd_grow(blkif_be_vbd_grow_t *grow)
     vbd_t              *vbd = NULL;
     rb_node_t          *rb;
     blkif_vdev_t        vdevice = grow->vdevice;
+    struct gendisk     *gd;
+    struct hd_struct   *hd;
 
     blkif = blkif_find_by_handle(grow->domid, grow->blkif_handle);
     if ( unlikely(blkif == NULL) )
@@ -123,6 +125,35 @@ void vbd_grow(blkif_be_vbd_grow_t *grow)
     x->extent.sector_length = grow->extent.sector_length; 
     x->next                 = (blkif_extent_le_t *)NULL; 
 
+    gd = get_gendisk(x->extent.device);
+
+    if (!gd || !gd->part)
+    {
+        grow->status = BLKIF_BE_STATUS_VBD_NOT_FOUND; 
+        DPRINTK("vbd_grow: device %08x doesn't exist.\n", x->extent.device);
+        goto out;
+    }
+
+    hd = &gd->part[MINOR(x->extent.device)];
+
+    if (!hd)
+    {
+        grow->status = BLKIF_BE_STATUS_VBD_NOT_FOUND; 
+        DPRINTK("vbd_grow: HD device %08x doesn't exist.\n", x->extent.device);
+        goto out;
+    }
+
+    printk("vbd_grow: requested_len %llu actual_len %lu\n", 
+          x->extent.sector_length,  hd->nr_sects );
+
+    /* this test assumes sector_start is zero, which in the new
+       IO world it always will be -- We need to simpligy the 
+       grow/shrink interface as we'll always be deadling with whole
+       devices
+    */
+    if ( x->extent.sector_length > hd->nr_sects )
+       x->extent.sector_length = hd->nr_sects;    
+
     for ( px = &vbd->extents; *px != NULL; px = &(*px)->next ) 
         continue;